//
//  UITextView+Emoticon.swift
//  emotion
//
//  Created by 张衡 on 15/8/12.
//  Copyright © 2015年 张衡. All rights reserved.
//

import UIKit

extension UITextView {
    
    
    // 将图片插入文本  功能
    // 注意： 如果在循环引用的闭包中调用函数，尽管函数中不出现self 但仍会出现循环引用
    func insertEmoticon(emoticon: Emoticon) {
        
        
        // 删除文本
        if emoticon.removeEmoticon {
            deleteBackward()  // UITextView 的系统方法，删除
            return
        }
        
        
        //        textView.text = emoticon.chs
        // 1. emoji 本质上就是一个字符串，可以直接在网络中传输
        if emoticon.emoji != nil {
            replaceRange(selectedTextRange!, withText: emoticon.emoji!)
            
            return
        }
        
        // 2. 表情图片
        if emoticon.chs != nil {
            
            /// 封装
//            // 1. 创建图片属性字符串
//            let attachment = EmoticonAttachment()
//            // 设置图片
//            attachment.image = UIImage(contentsOfFile: emoticon.imagePath)
//            // 记录表情文字 （我们自己扩展的一个属性）
//            attachment.chs = emoticon.chs
//            // 设置边界
//            let h = font?.lineHeight
//            // 提示，在scrollow 中，bounds 的原点x,y 就是contentoffset
//            attachment.bounds = CGRect(x: 0, y: -2, width: h!, height: h!)
//            
//            //            let imageText = NSAttributedString(attachment: attachment)
//            
//            let imageText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
//            
//            // 添加文本字体属性,（可变类型才可以添加） 文本跟随前一个字符的属性来显示大小，但是图片属性字符没有属性，要手动添加
//            // name : 属性的名称
//            // value ： 属性值
//            imageText.addAttribute(NSFontAttributeName, value: font!, range: NSMakeRange(0, 1))
            
            // 1. 创建图片属性字符串
            let imageText = EmoticonAttachment.iamgeText(emoticon, font: font!)
            
            
            // 2. 图片文字插入到 textView
            
            // 1> 获取textview中可变的属性文本，导出 是 UITextView.attributedText
            let attrString = NSMutableAttributedString(attributedString: attributedText)
            
            // 2> 插入图片文字 是 UITextView.selectedRange
            attrString.replaceCharactersInRange(selectedRange, withAttributedString: imageText)
            
            // 3> 使用可变属性文本替换文本视图的内容，导入
            
            // 1） 记录光标位置
            let range = selectedRange
            // 2） 设置内容
            attributedText = attrString
            // 3） 恢复光标位置
            selectedRange = NSRange(location: range.location + 1, length: 0)
            
            // 主动调用代理方法,满足某个条件时，通知代理去工作
            delegate?.textViewDidChange!(self)
        }
        
    }

    
    
    
    // 对属性文本进行检测，并且拼接返回一个字符串
//    func emoticonText() -> String {
    
    // 变成计算型属性
    var emoticonText : String {
        // print(textView.attributedText)
        // 属性文本是分段保存的，能否把每一个分段拿出来
        let attrString = attributedText
        
        var strM = String()
        //let string  = textView.text
        // print("*****\(string)")
        attrString.enumerateAttributesInRange(NSMakeRange(0, attrString.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (dict, range, _) -> Void in
            //            print("_____")
            //            print(dict)
            //            print(range)
            
            // 如果是图片，dict 中会包含 NSAttachment
            // 如何从 NSAttachment 中获取表情的文本
            if let attachment = dict["NSAttachment"] as? EmoticonAttachment {
                // print(attachment.chs)
                
                strM += attachment.chs!
            }
            else {
                // 使用range 来回去文本内容
                let str = (attrString.string as NSString).substringWithRange(range)
                // print(str)
                
                strM += str
            }
        }
        
//        print(strM)
        return strM
    }

}
